package es.deusto.ingenieria.tesoroaventurero;

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;

import es.deusto.ingenieria.is.formulation.State;
import es.deusto.ingenieria.is.xml.InformationXMLReader;

public class EscenarioXMLReader extends InformationXMLReader {

	private Point tesoro;
	private Personaje personaje;
	private Casilla	[][] celdas;
	private ArrayList<Casilla> gemas;
	
	public EscenarioXMLReader(String fileXML) {
		super(fileXML);
	}

	
	public Object getInformation(){
		Escenario escenario = new Escenario(this.celdas, this.tesoro, this.gemas);
		escenario.getPersonaje().setLocation(this.personaje);
		return escenario;
	}
	
	
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		try{
			if(qName.equals("is:maze")){
				this.celdas = new Casilla[Integer.parseInt(attributes.getValue("height"))][Integer.parseInt(attributes.getValue("width"))];
				this.gemas = new ArrayList<Casilla>();

				for (int y=0; y<this.celdas.length; y++) {
					for (int x=0; x<this.celdas[y].length; x++) {
						this.celdas[y][x] = new Casilla();
						this.celdas[y][x].y = y;
						this.celdas[y][x].x = x;
					}
				}
			}else if (qName.equals("is:start")){				
				this.personaje = new Personaje();
				this.personaje.y = Integer.parseInt(attributes.getValue("row"))-1;
				this.personaje.x = Integer.parseInt(attributes.getValue("column"))-1;
			}else if (qName.equals("is:treasure")) {
				this.tesoro = new Point();
				this.tesoro.y = Integer.parseInt(attributes.getValue("row"))-1;
				this.tesoro.x = Integer.parseInt(attributes.getValue("column"))-1;
			}else if (qName.equals("is:gemlocation")) {
				this.celdas[Integer.parseInt(attributes.getValue("row"))-1][Integer.parseInt(attributes.getValue("column"))-1].setGema(true);
				this.gemas.add(this.celdas[Integer.parseInt(attributes.getValue("row"))-1][Integer.parseInt(attributes.getValue("column"))-1]);
			}else if (qName.equals("is:eastarrow")) {
				this.celdas[Integer.parseInt(attributes.getValue("row"))-1][Integer.parseInt(attributes.getValue("column"))-1].setDerecha(true);
			}else if (qName.equals("is:westarrow")) {
				this.celdas[Integer.parseInt(attributes.getValue("row"))-1][Integer.parseInt(attributes.getValue("column"))-1].setIzquierda(true);
			}else if (qName.equals("is:northarrow")) {
				this.celdas[Integer.parseInt(attributes.getValue("row"))-1][Integer.parseInt(attributes.getValue("column"))-1].setArriba(true);
			}else if (qName.equals("is:southarrow")) {
				this.celdas[Integer.parseInt(attributes.getValue("row"))-1][Integer.parseInt(attributes.getValue("column"))-1].setAbajo(true);
			}
			
		}catch (Exception ex) {
			System.out.println(this.getClass().getName() + ".startElement(): " + ex);
			ex.printStackTrace();
		}
	}

	public Casilla[][] getCasillas() {
		return celdas;
	}

	public void setCasillas(Casilla[][] casillas) {
		this.celdas = casillas;
	}

	public Personaje getPersonaje() {
		return personaje;
	}

	public void setPersonaje(Personaje personaje) {
		this.personaje = personaje;
	}

	public Point getTesoro() {
		return tesoro;
	}

	public void setTesoro(Point tesoro) {
		this.tesoro = tesoro;
	}

	public ArrayList<Casilla> getGemas() {
		return gemas;
	}

	public void setGemas(ArrayList<Casilla> gemas) {
		this.gemas = gemas;
	}
}
